import chardet
import codecs

def stream_csv_unicode_exchange(input_path, output_path, target_encoding='gbk', chunk_size=1024 * 1024):
    """
    流式编码转换：将CSV文件从原始编码转为指定编码（如GBK），适用于大文件
    :param input_path: 输入文件路径
    :param output_path: 输出文件路径
    :param target_encoding: 目标编码
    :param chunk_size: 每次读取字节数（默认1MB）
    """
    # 1. 检测原始编码
    with open(input_path, 'rb') as f:
        result = chardet.detect(f.read(10000))
    source_encoding = result['encoding']
    print(f"源文件的编码方式为：{source_encoding}")

    if source_encoding is None:
        raise ValueError("无法识别文件编码")

    # 2. 流式读取并转换编码写入
    with codecs.open(input_path, 'r', encoding=source_encoding, errors='ignore') as infile, \
            codecs.open(output_path, 'w', encoding=target_encoding, errors='ignore') as outfile:

        while True:
            chunk = infile.read(chunk_size)
            if not chunk:
                break
            outfile.write(chunk)

    print(f"编码转换完成，已保存至 {output_path}")


if __name__ == '__main__':
    input_file = 'D:\\2-work\\25-创意组\\标签用户体系\\标签体系原始数据\\segmentation\\船视宝2025年用户接口访问记录\\船视宝2025年用户接口访问记录-part-1.csv'
    output_file = 'D:\\2-work\\25-创意组\\标签用户体系\\标签体系原始数据\\segmentation\\船视宝2025年用户接口访问记录\\船视宝2025年用户接口访问记录-part-1-new.csv'
    stream_csv_unicode_exchange(input_file, output_file)
